﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Text.RegularExpressions;

namespace CommonLibrary
{
    public class ConvertExt
    {
        /// <summary>
        /// StringToByteArray - Hàm chuyển đổi từ 1 chuỗi string ra 1 mảng byte
        /// </summary>
        /// <param name="strInput"></param>
        /// <returns></returns>
        public static byte[] StringToByteArray(string strInput)
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strInput);
            return bytes;
        }

        /// <summary>
        /// ByteArrayToBitArray - Hàm chuyển đổi từ 1 mảng byte thành 1 mảng bit
        /// </summary>
        /// <param name="bInput"></param>
        /// <returns></returns>
        public static BitArray ByteArrayToBitArray(byte[] bInput)
        {
            string temp1 = "";
            string temp2 = "";
            foreach (byte b in bInput)
            {
                temp1 = temp1 + Convert.ToString(b, 2).PadLeft(8, '0');
            }

            foreach (char c in temp1)
            {
                temp2 = temp2 + "|" + c;
            }
            string[] splitString = (temp2.Substring(1).Split('|')).ToArray();
            bool[] boolString = new bool[splitString.Length];
            for (int x = 0; x < splitString.Length; x++)
            {
                boolString[x] = System.Boolean.Parse((splitString[x] == "1" ? "true" : "false"));
            }

            BitArray bits1 = new BitArray(boolString);

            return bits1;
        }

        /// <summary>
        /// StringBitToByteArray - Hàm chuyển đổi từ 1 dãy bit thành 1 mảng byte (1 byte = 8 bit)
        /// </summary>
        /// <param name="bits">10011000101010101</param>
        /// <returns></returns>
        public static byte[] StringBitToByteArray(string bits)
        {
            byte[] bytes =
              Regex.Matches(bits, ".{8}").Cast<Match>()
              .Select(m => Convert.ToByte(m.Groups[0].Value, 2))
              .ToArray();
            return bytes;
        }

        /// <summary>
        /// StringToStringBit - Hàm chuyển đổi từ 1 chuỗi string xang 1 chuỗi bit
        /// </summary>
        /// <param name="strInput">ThangNM</param>
        /// <returns>01010100011010000110000101101110011001110100111001001101</returns>
        public static string StringToStringBit(string strInput)
        {
            string strTemp = "";
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strInput);
            foreach (byte b in bytes)
            {
                strTemp = strTemp + Convert.ToString(b, 2).PadLeft(8, '0');
            }
            return strTemp;
        }

        /// <summary>
        /// StringToBitArray - Hàm chuyển từ chuỗi string xang mảng bit
        /// </summary>
        /// <param name="strInput"></param>
        /// <returns></returns>
        public static BitArray StringToBitArray(String strInput)
        {
            string[] splitString = (StringToStringBitArray(strInput).Split('|').ToArray());
            bool[] boolString = new bool[splitString.Length];
            for (int x = 0; x < splitString.Length; x++)
            {
                boolString[x] = System.Boolean.Parse((splitString[x] == "1" ? "true" : "false"));
            }
            BitArray bits1 = new BitArray(boolString);
            return bits1;
        }

        /// <summary>
        /// StringToStringBitArray - Hàm chuyển từ chuỗi string xang 1 chuỗi string dạng mảng bit
        /// </summary>
        /// <param name="strInput">TNM</param>
        /// <returns>0|1|0|1|0|1|0|0|0|1|0|0|1|1|1|0|0|1|0|0|1|1|0|1</returns>
        public static String StringToStringBitArray(String strInput)
        {
            string temp1 = "";
            string temp2 = "";
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(strInput);
            foreach (byte b in bytes)
            {
                temp1 = temp1 + Convert.ToString(b, 2).PadLeft(8, '0');
            }

            foreach (char c in temp1)
            {
                temp2 = temp2 + "|" + c;
            }
            return temp2.Substring(1);
        }
    }
}
